package com.jcark.utilscode.listener

import android.content.res.ColorStateList
import android.view.View
import androidx.core.content.ContextCompat
import com.blankj.utilcode.util.NetworkUtils
import com.jcark.utilscode.MToastUtils
import com.jcark.utilscode.R
import com.jcark.utilscode.util.RxView
import kotlinx.coroutines.*

/**
 * Description:View事件扩展 <br>
 * @author King.Zi<br>
 * @date 2023/5/26<br>
 * Email: 78688689@qq.com
 */

/**
 * 防抖动点击事件（协程方案）
 * @param listener 事件
 * @param delayTime 防抖动时间间隔
 * @param isCheckNetwork 是否检查网络状态
 * @param noNetworkMessage 无网络时的提示信息
 * @param onNetworkInvalid 无网络时的处理方法
 */
fun View.setDebounceClickListener(
    listener: View.OnClickListener,
    delayTime: Long = 500L,
    isCheckNetwork: Boolean = false,
    noNetworkMessage: String = context.getString(
        R.string.message_invalid_network
    ),
    onNetworkInvalid: (() -> Unit)? = null
) {
    var job: Job? = null
    var clickable = true
    this.setOnClickListener {
        if (!clickable) {
            job?.cancel()
        }
        runBlocking {
            job = CoroutineScope(Dispatchers.Main).launch {
                if (clickable) {
                    clickable = false
                    if (isCheckNetwork) {
                        if (NetworkUtils.isNetworkAvailable()) {
                            listener.onClick(it)
                        } else {
                            if (null != onNetworkInvalid) {
                                onNetworkInvalid.invoke()
                            } else {
                                MToastUtils.shortShow(message = noNetworkMessage)
                            }
                        }
                    } else {
                        listener.onClick(it)
                    }
                }
                delay(delayTime)
                clickable = true
            }
        }
    }
}

/**
 * 防抖动点击事件(时间比较方案)
 * @param listener 事件
 * @param delayTime 防抖动时间间隔
 * @param isCheckNetwork 是否检查网络状态
 * @param noNetworkMessage 无网络时的提示信息
 * @param onNetworkInvalid 无网络时的处理方法
 */
fun View.setDebounceClickListener(
    listener: DebounceClickListener,
    delayTime: Long = 500L,
    isCheckNetwork: Boolean = false,
    noNetworkMessage: String = context.getString(
        R.string.message_invalid_network
    ),
    onNetworkInvalid: (() -> Unit)? = null
) {
    this.setOnClickListener {
        listener.delayTime = delayTime
        if (isCheckNetwork) {
            if (NetworkUtils.isNetworkAvailable()) {
                listener.onClick(it)
            } else {
                if (null != onNetworkInvalid) {
                    onNetworkInvalid.invoke()
                } else {
                    MToastUtils.shortShow(message = noNetworkMessage)
                }
            }
        } else {
            listener.onClick(it)
        }
    }
}

/**
 * 设置点击事件，并检查网络
 * @param onNetworkAvailable 网络有效时的事件
 * @param onNetworkInvalid 网络无效时的事件，当此事件非空时，不会弹出【noNetworkMessage】提示信息
 * @param noNetworkMessage 网络无效时的提示信息
 */
fun View.setOnClickWithCheckNetworkListener(
    onNetworkAvailable: (() -> Unit),
    onNetworkInvalid: (() -> Unit)? = null,
    noNetworkMessage: String = context.getString(
        R.string.message_invalid_network
    ),
) {
    this.setOnClickListener {
        if (NetworkUtils.isNetworkAvailable()) {
            onNetworkAvailable.invoke()
        } else {
            if (null != onNetworkInvalid) {
                onNetworkInvalid.invoke()
            } else {
                MToastUtils.shortShow(message = noNetworkMessage)
            }
        }
    }
}

/**
 * 设置防抖点击事件
 */
fun View.click(clickListener: View.OnClickListener) {
    RxView.setOnClickListeners({ view -> clickListener.onClick(view) }, 800, this)
}

/**
 * 设置防抖点击事件
 */
fun View.click(time:Int=300,clickListener: View.OnClickListener) {
    RxView.setOnClickListeners({ view -> clickListener.onClick(view) }, time, this)
}